/**
 * 问题：
 * 实现一个函数功能
 * const add = curry(fn,4), fn表示传入函数，4表示fn的参数长度
 * add(1)(2)(3)(4) // 10
 * add(1, 2)(3)(4) // 10
 * add(1, 2, 3)(4) // 10
*/


/**
 * @param {Function} fn 传入的函数
 * @param {Function} ARITY 传入的函数参数长度
 * @return {Function} 返回一个单参调用的函数
*/
function curry(fn, ARITY = fn.length) {
  // 获取除fn之外的前置参数
  const args = Array.prototype.slice.call(arguments, 2)
  return function (...restArgs) {
    // 所有参数
    const allArgs = [...args, ...restArgs]
    if (allArgs.length >= ARITY) {
      // 传的参数达到fn的参数长度才调用fn
      return fn.apply(null, allArgs.slice(0, ARITY))
    } else {
      // 否则递归调用curry
      return curry.call(null, fn, ARITY, ...allArgs)
    }
  }
}


// 测试
function addFn() {
  return [...arguments].reduce((acc, num) => acc + num, 0)
}
const add = curry(addFn, 4)
console.log(add(1, 2, 3, 4)) // 10
console.log(add(1, 2)(3, 4)) // 10
console.log(add(1, 2, 3)(4)) // 10
console.log(add(1)(2)(3)(4)) // 10
console.log(add(1, 2, 3, 4, 5)) // 10
console.log(add(1, 2, 3, 4)(5)) // 报错，10 不是一个函数
